4.

Давайте вернёмся к данным выживаемости пациентов с лейкоцитарной лимфомой из видео про критерий знаков:

49,58,75,110,112,132,151,276,281,362∗ Измерено остаточное время жизни с момента начала наблюдения (в неделях); звёздочка обозначает цензурирование сверху — исследование длилось 7 лет, и остаточное время жизни одного пациента, который дожил до конца наблюдения, неизвестно.

Поскольку цензурировано только одно наблюдение, для проверки гипотезы H0:medX=200 на этих данных можно использовать критерий знаковых рангов — можно считать, что время дожития последнего пациента в точности равно 362, на ранг этого наблюдения это никак не повлияет.

Критерием знаковых рангов проверьте эту гипотезу против двусторонней альтернативы, введите достигаемый уровень значимости, округлённый до четырёх знаков после десятичной точки.

5.

В ходе исследования влияния лесозаготовки на биоразнообразие лесов острова Борнео собраны данные о количестве видов деревьев в 12 лесах, где вырубка не ведётся:

22,22,15,13,19,19,18,20,21,13,13,15, и в 9 лесах, где идёт вырубка:

17,18,18,15,12,4,14,15,10. Проверьте гипотезу о равенстве среднего количества видов в двух типах лесов против односторонней альтернативы о снижении биоразнообразия в вырубаемых лесах. Используйте ранговый критерий. Чему равен достигаемый уровень значимости? Округлите до четырёх знаков после десятичной точки.

6.

28 января 1986 года космический шаттл "Челленджер" взорвался при взлёте. Семь астронавтов, находившихся на борту, погибли. В ходе расследования причин катастрофы основной версией была неполадка с резиновыми уплотнительными кольцами в соединении с ракетными ускорителями. Для 23 предшествовавших катастрофе полётов "Челленджера" известны температура воздуха и появление повреждений хотя бы у одного из уплотнительных колец. С помощью бутстрепа постройте 95% доверительный интервал для разности средних температур воздуха при запусках, когда уплотнительные кольца повреждались, и запусках, когда повреждений не было. Чему равна его ближайшая к нулю граница? Округлите до четырёх знаков после запятой.

Чтобы получить в точности такой же доверительный интервал, как у нас:

установите random seed = 0 перед первым вызовом функции get_bootstrap_samples, один раз сделайте по 1000 псевдовыборок из каждой выборки.

7.

На данных предыдущей задачи проверьте гипотезу об одинаковой средней температуре воздуха в дни, когда уплотнительный кольца повреждались, и дни, когда повреждений не было. Используйте перестановочный критерий и двустороннюю альтернативу. Чему равен достигаемый уровень значимости? Округлите до четырёх знаков после десятичной точки.

Чтобы получить такое же значение, как мы: установите random seed = 0; возьмите 10000 перестановок.


In [48]:
import numpy as np
import pandas as pd
import itertools

from scipy import stats
from statsmodels.stats.descriptivestats import sign_test
from statsmodels.stats.weightstats import zconfint
%pylab inline


Populating the interactive namespace from numpy and matplotlib

Task 4


In [49]:
data = np.array([49,58,75,110,112,132,151,276,281,362])

In [50]:
pylab.hist(data)
pylab.show()



In [8]:
print '95%% confidence interval for the mean time: [%f, %f]' % zconfint(data)


95% confidence interval for the mean time: [93.808829, 227.391171]

In [9]:
print "M: %d, p-value: %f" % sign_test(data, 200)


M: -2, p-value: 0.343750

In [51]:
stats.wilcoxon(data - 200)


Out[51]:
WilcoxonResult(statistic=17.0, pvalue=0.28450269791120747)

Task 5


In [91]:
a = np.array([22,22,15,13,19,19,18,20,21,13,13,15])
b = np.array([17,18,18,15,12,4,14,15,10])

stats.mannwhitneyu(b, a, alternative='less')


Out[91]:
MannwhitneyuResult(statistic=27.0, pvalue=0.029004992720873729)

In [92]:
stats.mannwhitneyu(a, b, alternative='greater')


Out[92]:
MannwhitneyuResult(statistic=81.0, pvalue=0.029004992720873729)

In [ ]:

Task 6


In [103]:
def get_bootstrap_samples(data, n_samples):
    indices = np.random.randint(0, len(data), (n_samples, len(data)))
    samples = data[indices]
    return samples

In [104]:
def stat_intervals(stat, alpha):
    boundaries = np.percentile(stat, [100 * alpha / 2., 100 * (1 - alpha / 2.)])
    return boundaries

In [123]:
data = pd.read_csv('challenger.txt', sep='\t')

In [124]:
data.head()


Out[124]:
Unnamed: 0 Temperature Incident
0 Apr12.81 18.9 0
1 Nov12.81 21.1 1
2 Mar22.82 20.6 0
3 Nov11.82 20.0 0
4 Apr04.83 19.4 0

In [125]:
a = data[data['Incident']==0]['Temperature'].values
b = data[data['Incident']==1]['Temperature'].values

In [108]:
len(a) + len(b) == data.shape[0]


Out[108]:
True

In [109]:
np.random.seed(0)

a_scores = np.array(map(np.mean, get_bootstrap_samples(a, 1000)))
b_scores = np.array(map(np.mean, get_bootstrap_samples(b, 1000)))

In [ ]:


In [110]:
print "95% confidence interval for the difference between medians",  stat_intervals(a_scores - b_scores, 0.05)


95% confidence interval for the difference between medians [ 1.42299107  7.93861607]

In [111]:
print "95% confidence interval for the difference between medians",  stat_intervals(b_scores - a_scores, 0.05)


95% confidence interval for the difference between medians [-7.93861607 -1.42299107]

Task 7


In [ ]:


In [126]:
def permutation_t_stat_ind(sample1, sample2):
    return np.mean(sample1) - np.mean(sample2)

In [127]:
def get_random_combinations(n1, n2, max_combinations):
    index = range(n1 + n2)
    indices = set([tuple(index)])
    for i in range(max_combinations - 1):
        np.random.shuffle(index)
        indices.add(tuple(index))
    return [(index[:n1], index[n1:]) for index in indices]

In [128]:
def permutation_zero_dist_ind(sample1, sample2, max_combinations = None):
    joined_sample = np.hstack((sample1, sample2))
    n1 = len(sample1)
    n = len(joined_sample)
    
    if max_combinations:
        indices = get_random_combinations(n1, len(sample2), max_combinations)
    else:
        indices = [(list(index), filter(lambda i: i not in index, range(n))) \
                    for index in itertools.combinations(range(n), n1)]
    
    distr = [joined_sample[list(i[0])].mean() - joined_sample[list(i[1])].mean() \
             for i in indices]
    return distr

In [129]:
def permutation_test(sample, mean, max_permutations = None, alternative = 'two-sided'):
    if alternative not in ('two-sided', 'less', 'greater'):
        raise ValueError("alternative not recognized\n"
                         "should be 'two-sided', 'less' or 'greater'")
    
    t_stat = permutation_t_stat_ind(sample, mean)
    
    zero_distr = permutation_zero_dist_ind(sample, mean, max_permutations)
    
    if alternative == 'two-sided':
        return sum([1. if abs(x) >= abs(t_stat) else 0. for x in zero_distr]) / len(zero_distr)
    
    if alternative == 'less':
        return sum([1. if x <= t_stat else 0. for x in zero_distr]) / len(zero_distr)

    if alternative == 'greater':
        return sum([1. if x >= t_stat else 0. for x in zero_distr]) / len(zero_distr)

In [130]:
np.random.seed(0)

In [131]:
print "p-value: %f" % permutation_test(a, b, max_permutations = 10000)


p-value: 0.007000

In [ ]: